///*
// * Copyright (c) 2011-2020, baomidou (jobob@qq.com).
// * <p>
// * Licensed under the Apache License, Version 2.0 (the "License"); you may not
// * use this file except in compliance with the License. You may obtain a copy of
// * the License at
// * <p>
// * https://www.apache.org/licenses/LICENSE-2.0
// * <p>
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// * License for the specific language governing permissions and limitations under
// * the License.
// */
//package com.ctrip.corp.obt.shard.sql.parser;
//
//
//import com.ctrip.corp.obt.generic.utils.CollectionUtils;
//import com.ctrip.corp.obt.generic.utils.ExceptionUtils;
//import lombok.extern.slf4j.Slf4j;
//import net.sf.jsqlparser.JSQLParserException;
//import net.sf.jsqlparser.parser.CCJSqlParserUtil;
//import net.sf.jsqlparser.statement.Statement;
//import net.sf.jsqlparser.statement.Statements;
//import net.sf.jsqlparser.statement.delete.Delete;
//import net.sf.jsqlparser.statement.insert.Insert;
//import net.sf.jsqlparser.statement.select.PlainSelect;
//import net.sf.jsqlparser.statement.select.Select;
//import net.sf.jsqlparser.statement.select.SelectBody;
//import net.sf.jsqlparser.statement.select.SetOperationList;
//import net.sf.jsqlparser.statement.select.WithItem;
//import net.sf.jsqlparser.statement.update.Update;
//import org.apache.ibatis.reflection.MetaObject;
//
///**
// * 抽象 SQL 解析类
// *
// * @author marco.zheng
// * @since 2017-06-20
// */
//@Slf4j
//public abstract class AbstractSqlParser implements ISqlParser {
//
//    /**
//     * 解析 SQL 方法
//     *
//     * @param metaObject 元对象
//     * @param sql        SQL 语句
//     * @return SQL 信息
//     */
//
//    @Override
//    public SqlInfo parser(MetaObject metaObject, String sql) {
//        if (this.allowProcess(metaObject)) {
//            try {
//                if (log.isDebugEnabled()) {
//                    log.debug("Original SQL: " + sql);
//                }
//                StringBuilder sqlStringBuilder = new StringBuilder();
//                Statements statements = CCJSqlParserUtil.parseStatements(sql);
//                int i = 0;
//                for (Statement statement : statements.getStatements()) {
//                    if (null != statement) {
//                        if (i++ > 0) {
//                            sqlStringBuilder.append(';');
//                        }
//                        sqlStringBuilder.append(this.processParser(statement).getSql());
//                    }
//                }
//                if (sqlStringBuilder.length() > 0) {
//                    return SqlInfo.newInstance().setSql(sqlStringBuilder.toString());
//                }
//            } catch (JSQLParserException e) {
//                throw ExceptionUtils.mpe("Failed to process, please exclude the tableName or statementId.\n Error SQL: %s", e, sql);
//            }
//        }
//        return null;
//    }
//
//    /**
//     * 执行 SQL 解析
//     *
//     * @param statement JsqlParser Statement
//     * @return
//     */
//    public SqlInfo processParser(Statement statement) {
//        if (statement instanceof Insert) {
//            this.processInsert((Insert) statement);
//        } else if (statement instanceof Select) {
//            this.processSelectBody(((Select) statement).getSelectBody());
//        } else if (statement instanceof Update) {
//            this.processUpdate((Update) statement);
//        } else if (statement instanceof Delete) {
//            this.processDelete((Delete) statement);
//        }
//        if (log.isDebugEnabled()) {
//            log.debug("Parser sql: " + statement.toString());
//        }
//        return SqlInfo.newInstance().setSql(statement.toString());
//    }
//
//    /**
//     * 新增
//     */
//    public abstract void processInsert(Insert insert);
//
//    /**
//     * 删除
//     */
//    public abstract void processDelete(Delete delete);
//
//    /**
//     * 更新
//     */
//    public abstract void processUpdate(Update update);
//
//    /**
//     * 查询
//     */
//    public abstract void processPlainSelect(PlainSelect selectBody);
//
//
//    /**
//     * 查询
//     */
//    protected void processSelectBody(SelectBody selectBody) {
//        if (selectBody instanceof PlainSelect) {
//            processPlainSelect((PlainSelect) selectBody);
//        } else if (selectBody instanceof WithItem) {
//            WithItem withItem = (WithItem) selectBody;
//            if (withItem.getSubSelect().getSelectBody() != null) {
//                processSelectBody(withItem.getSubSelect().getSelectBody());
//            }
//        } else {
//            SetOperationList operationList = (SetOperationList) selectBody;
//            if (CollectionUtils.isNotEmpty(operationList.getSelects())) {
//                operationList.getSelects().forEach(this::processSelectBody);
//            }
//        }
//    };
//
//    /**
//     * 判断是否允许执行
//     * <p>例如：逻辑删除只解析 delete , update 操作</p>
//     *
//     * @param metaObject 元对象
//     * @return true
//     */
//    public boolean allowProcess(MetaObject metaObject) {
//        return true;
//    }
//}
